Skip to content

Conversation

Mr2P
Copy link

@Mr2P Mr2P commented Aug 30, 2025

The formatted_value property of the $field['name'] . '_source' should come from the original value, not the REST value. Other plugins might change the REST value using the filter acf/rest/format_value_for_rest, which can cause the formatted_value to be incorrect.

Mr2P added 2 commits August 30, 2025 14:37
…tted value for rest

The `formatted_value` property of the $field['name'] . '_source' should come from the original value, not the REST value. Other plugins might change the REST value using the filter `acf/rest/format_value_for_rest`, which can cause the `formatted_value` to be incorrect.
The formatted_value property of the $field['name'] . '_source' should come from the original value, not the REST value. Other plugins might change the REST value using the filter acf/rest/format_value_for_rest, which can cause the formatted_value to be incorrect.

// We keep this one for backward compatibility with existing code that expects the field value to be.
$fields[ $field['name'] ] = $value;
$fields[ $field['name'] ] = $rest_value;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the contribution!

Why will this fix your fatal error on the plugin? The change, as far as I can see, is just changing a variable name.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi, thanks for approving the pull request.
Here is my explanation.

The original code from SCF:

// Get raw value.
$value = acf_get_value( $post_id, $field );

// First format for rest API for backward compatibility.
$value = acf_format_value_for_rest( $value, $post_id, $field, $format );

// We keep this one for backward compatibility with existing code that expects the field value to be.
$fields[ $field['name'] ] = $value;
$fields[ $field['name'] . '_source' ] = array(
'label' => $field['label'],
'type' => $field['type'],
// This line re-formats the already formatted REST value instead of the raw value, which causes issues.
'formatted_value' => acf_format_value( $value, $post_id, $field ),
);

I fixed it by renaming the formatted REST value to $rest_value and leaving the original $value untouched. This way, when calling acf_format_value() to populate the formatted_value property of _source, it’s based on the raw value, not on the already formatted value:

// Format value for rest API for backward compatibility.
$rest_value = acf_format_value_for_rest( $value, $post_id, $field, $format );

// We keep this one for backward compatibility with existing code that expects the field value to be.
$fields[ $field['name'] ] = $rest_value;
$fields[ $field['name'] . '_source' ] = array(
'label' => $field['label'],
'type' => $field['type'],
'formatted_value' => acf_format_value( $value, $post_id, $field ),
);

In my plugin (Meta Field Block), I used the 'acf/rest/format_value_for_rest' filter to change the format of the REST value to support displaying all field types (even Group, Repeater, Flexible, Relationship, etc). When SCF re-format some multi-value field types like select, it treats the altered REST value as multiple values, which is why the error occurs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants